// 给定两个字符串 X = x1, x2, ..., xm 和 Y = y1, y2, ..., yn，要求找到它们的最长公共子序列（LCS）的长度。
// LCS 是一个既是 X 的子序列又是 Y 的子序列的最长序列

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int longestCommonSubsequence(char *x, char *y){
    int lx = strlen(x);
    int ly = strlen(y);
    int **dp = (int**)malloc((lx+1) * sizeof(int*));
    for(int i=0;i<=lx;i++){
        dp[i] = (int*)malloc((ly+1) * sizeof(int));
    }

    // 初始化dp
    for(int i=0;i<=lx;i++){
        for(int j=0;j<=ly;j++){
            dp[i][j] = 0;
        }
    }

    for(int i=1;i<=lx;i++){
        for(int j=1;j<=ly;j++){
            if(x[i]==y[j]){
                dp[i][j] = dp[i-1][j-1] + 1;
            }else{
                dp[i][j] = dp[i-1][j]>dp[i][j-1] ? dp[i-1][j] : dp[i][j-1];
            }
        }
    }

    return dp[lx][ly];
}


int main(){
    char x[] = "abcbdabdaa";
    char y[] = "bdcabaad";
    int result = longestCommonSubsequence(x,y);
    printf("%d",result);

    return 0;
}